//
// Created by zhku666 on 25-2-24.
//
#include <cstring>
#include <stdio.h>
#include <stdlib.h>

// 判断cattle_id是否已经被绑定
bool is_cattle_bound(const char *cattle_id) {
    FILE *file = fopen("cattle.txt", "r");
    if (!file) {
        return false; // 文件不存在或无法打开，返回未绑定
    }

    char line[100];
    while (fgets(line, sizeof(line), file)) {
        char id[100], sensor[100];
        sscanf(line, "%[^-]-%*[^-]-%[^-\n]", id, sensor); // 跳过年份字段，读取sensor_id
        if (strcmp(id, cattle_id) == 0 && strcmp(sensor, "NULL") != 0) {
            fclose(file);
            return true; // 找到匹配的cattle_id且已绑定
        }
    }

    fclose(file);
    return false; // 未找到或未绑定
}

// 更新cattle.txt文件
void update_cattle_file(const char *cattle_id, const char *sensor_id) {

    FILE *file = fopen("cattle.txt", "r");
    if (!file) {
        perror("无法打开cattle.txt文件");
        return;
    }

    FILE *tempFile = fopen("temp.txt", "w");
    if (!tempFile) {
        perror("无法打开临时文件");
        fclose(file);
        return;
    }

    char line[100];
    while (fgets(line, sizeof(line), file)) {
        char id[100];
        sscanf(line, "%[^-]", id);
        if (strcmp(id, cattle_id) == 0) {
            fprintf(tempFile, "%s-NULL-%s\n", cattle_id, sensor_id); // 更新绑定关系
        } else {
            fprintf(tempFile, "%s", line);
        }
    }

    fclose(file);
    fclose(tempFile);

    remove("cattle.txt");
    rename("temp.txt", "cattle.txt");


}

// 更新sensor.txt文件
void update_sensor_file(const char *sensor_id, const char *cattle_id) {

    get_lock();

    FILE *file = fopen("sensor.txt", "r");
    if (!file) {
        perror("无法打开sensor.txt文件");
        return;
    }

    FILE *tempFile = fopen("temp.txt", "w");
    if (!tempFile) {
        perror("无法打开临时文件");
        fclose(file);
        return;
    }

    char line[100];
    while (fgets(line, sizeof(line), file)) {
        char id[100];
        sscanf(line, "%[^-]", id);
        if (strcmp(id, sensor_id) == 0) {
            fprintf(tempFile, "%s-%s-%s", sensor_id, cattle_id, line + strlen(sensor_id) + 1 + strlen(cattle_id) + 1);
        } else {
            fprintf(tempFile, "%s", line);
        }
    }

    fclose(file);
    fclose(tempFile);

    remove("sensor.txt");
    rename("temp.txt", "sensor.txt");

    unlock();


}

// 绑定牛和传感器
void binding() {
    char cattle_id[100];
    char sensor_id[100];
    printf("请输入牛的ID：\n");
    scanf("%s", cattle_id);
    printf("请输入传感器的ID：\n");
    scanf("%s", sensor_id);

    // 判断cattle_id是否存在
    if (!judge_cattle_id(cattle_id)) {
        printf("错误：牛ID '%s' 不存在。\n", cattle_id);
        log("绑定失败");
        return;
    }

    // 判断sensor_id是否存在
    if (!judge_sensor_id(sensor_id)) {
        printf("错误：传感器ID '%s' 不存在。\n", sensor_id);
        char logMessage[200];
        sprintf(logMessage, "传感器不存在，绑定失败，id为:%s", sensor_id);
        log(logMessage);
        return;
    }

    // 判断cattle_id是否已经被绑定
    if (is_cattle_bound(cattle_id)) {
        printf("错误：牛ID '%s' 已经被绑定。\n", cattle_id);
        char logMessage[200];
        sprintf(logMessage, "该牛已绑定，绑定失败，id为:%s", cattle_id);
        log(logMessage);
        return;
    }


    // 更新cattle.txt文件
    update_cattle_file(cattle_id, sensor_id);

    // 同步更新sensor.txt文件
    update_sensor_file(sensor_id, cattle_id);

    printf("牛ID '%s' 与传感器ID '%s' 绑定成功。\n", cattle_id, sensor_id);
    char logMessage[200];
    sprintf(logMessage, "绑定成功，牛id为:%s，传感器id为:%s", cattle_id,sensor_id);
    log(logMessage);
}

// 解绑牛和传感器
void remove_binding() {
    char cattle_id[100];
    printf("请输入牛的ID：\n");
    scanf("%s", cattle_id);

    // 判断cattle_id是否存在
    if (!judge_cattle_id(cattle_id)) {
        printf("错误：牛ID '%s' 不存在。\n", cattle_id);
        char logMessage[200];
        sprintf(logMessage, "该牛不存在，解绑失败，id为:%s", cattle_id);
        log(logMessage);
        return;
    }

    // 判断cattle_id是否已经被绑定
    if (!is_cattle_bound(cattle_id)) {
        printf("错误：牛ID '%s' 未被绑定。\n", cattle_id);
        char logMessage[200];
        sprintf(logMessage, "该牛未被绑定，解绑失败，id为:%s", cattle_id);
        log(logMessage);
        return;
    }

    // 获取绑定的sensor_id
    char sensor_id[100];
    FILE *file = fopen("cattle.txt", "r");
    if (!file) {
        perror("无法打开cattle.txt文件");
        return;
    }

    char line[100];
    while (fgets(line, sizeof(line), file)) {
        char id[100], sid[100];
        sscanf(line, "%[^-]-%*[^-]-%[^-\n]", id, sid);
        if (strcmp(id, cattle_id) == 0) {
            strcpy(sensor_id, sid);
            break;
        }
    }
    fclose(file);

    // 更新cattle.txt文件
    update_cattle_file(cattle_id, "NULL");

    // 同步更新sensor.txt文件
    update_sensor_file(sensor_id, "NULL");

    printf("牛ID '%s' 解绑成功。\n", cattle_id);
    char logMessage[200];
    sprintf(logMessage, "解绑成功，牛id为:%s，传感器id为:%s", cattle_id,sensor_id);
    log(logMessage);
}

// 主菜单
void bind() {
    int input = 0;
    while (1) {
        printf("--------------绑定--------------\n");
        printf("1.绑定\n");
        printf("2.解绑\n");
        printf("输入其他返回\n");
        scanf("%d", &input);
        switch (input) {
            case 1:
                binding();
                break;
            case 2:
                remove_binding();
                break;
            default:
                return;
        }
    }
}
